#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#define ELEMENT_TYPE void *

#include <iostream>
using namespace std;

struct LinkNode 
{
public:
    LinkNode(ELEMENT_TYPE data,LinkNode* next): m_data(data),m_next(next){}

public:
    ELEMENT_TYPE m_data;  /*数据域*/
    LinkNode* m_next;     /*指针域*/
};

class Linklist
{
public:
    /*构造函数*/
    Linklist();
    /*析构函数*/
    ~Linklist();
public:
    /*链表的头插*/
    int linkListHeadInsert(ELEMENT_TYPE data);
    /*链表的尾插*/
    int linkListTailInsert(ELEMENT_TYPE data);
    /*链表的任意位置插入*/
    int linkListAppointPosInsert(int pos,ELEMENT_TYPE data);
    /*遍历链表元素*/
    int travelArrayElement();
    /*链表的头删*/
    int linkListHeadDelete();
    /*链表的尾删*/
    int linkListTailDelete();
    /*链表的任意位置删除*/
    int linkListAppointPosDelete(int pos);
    /*得到头节点的值*/
    ELEMENT_TYPE getHeadval();
    /*得到尾节点的值*/
    ELEMENT_TYPE getTailVal();
    /*得到任意位置的值*/
    ELEMENT_TYPE linkListGetApponedposData(int pos);
    /*得到链表长度*/
    int getListLen();
public:
    LinkNode* reverseList(); 
   
LinkNode* getHeadNode(); 

// 获取链表的尾节点
LinkNode* getTailNode() ;
// 更新尾节点
void updateTail(LinkNode* newTail);

// 减少链表的大小
void decreaseSize();
private:
    /*头指针*/
    LinkNode * m_head;
    /*尾指针*/
    LinkNode * m_tail;
    int m_size;
};




#endif //__LINKLIST_H__